package PrzestrzenCiagla;

import java.util.ArrayList;
import java.util.List;

public abstract class ZlozonyCiaglyZbiorRozmyty extends CiaglyZbiorRozmyty {

	List<CiaglyZbiorRozmyty> listaZbiorow;

	public ZlozonyCiaglyZbiorRozmyty(List<CiaglyZbiorRozmyty> listaZbiorow) {
		
		super(nowaPrzestrzen(listaZbiorow), null);
		this.listaZbiorow = listaZbiorow;
	}
	
	public ZlozonyCiaglyZbiorRozmyty(CiaglyZbiorRozmyty zbior1, CiaglyZbiorRozmyty zbior2) {
		super(nowaPrzestrzen(nowaListaZbiorow(zbior1, zbior2)), null);
		this.listaZbiorow = nowaListaZbiorow(zbior1, zbior2);
	}
	
	@Override
	public abstract float getPrzynaleznosc(float x);
	
	@Override
	public boolean czyNormalny() {
		for(CiaglyZbiorRozmyty zbior : listaZbiorow){
			if(!zbior.czyNormalny()){
				return false;
			}
		}
		return true;
	}

	@Override
	public boolean czyPusty() {
		for(CiaglyZbiorRozmyty zbior : listaZbiorow){
			if(!zbior.czyPusty()){
				return true;
			}
		}
		return false;
	}

	@Override
	public boolean czyWklesly() {
		// TODO Auto-generated method stub
		return super.czyWklesly();
	}

	@Override
	public boolean czyWypukly() {
		return !czyWklesly();
	}

	@Override
	public float getWysokosc() {
		float wysokosc = 0.0f;
		for(CiaglyZbiorRozmyty zbior : listaZbiorow){
			wysokosc = Math.max(zbior.getWysokosc(), wysokosc);
		}
		return wysokosc;
	}

	private static PrzestrzenCiagla nowaPrzestrzen(List<CiaglyZbiorRozmyty> listaZbiorow){
		float nowyKoniec = Float.MIN_VALUE;
		float nowyPoczatek = Float.MAX_VALUE;
		float nowyKrok = Float.MAX_VALUE;
		for (CiaglyZbiorRozmyty ciaglyZbiorRozmyty : listaZbiorow) {
			nowyKoniec = Math.max(ciaglyZbiorRozmyty.getPrzestrzen().getKoniec(), nowyKoniec);
			nowyPoczatek = Math.min(ciaglyZbiorRozmyty.getPrzestrzen().getPoczatek(), nowyPoczatek);
			nowyKrok = Math.min(ciaglyZbiorRozmyty.getPrzestrzen().getKrok(), nowyKrok);
			
		}
		return new PrzestrzenCiagla(nowyPoczatek, nowyKoniec,nowyKrok);
	}
	
	private static List<CiaglyZbiorRozmyty> nowaListaZbiorow(CiaglyZbiorRozmyty zbior1, CiaglyZbiorRozmyty zbior2){
		
		List<CiaglyZbiorRozmyty> listaZbiorow = new ArrayList<CiaglyZbiorRozmyty>(2);
		listaZbiorow.add(zbior1);
		listaZbiorow.add(zbior2);
		return listaZbiorow;
	}
}
